/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-ElasticSearch-缺省实现
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.es.facade;

import com.taipingframework.boot.es.conditions.query.LambdaDeleteWrapper;
import com.taipingframework.boot.es.conditions.query.LambdaQueryWrapper;
import com.taipingframework.boot.es.conditions.query.LambdaUpdateWrapper;
import com.taipingframework.boot.web.pojo.PageEntity;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface ReactorElasticAccess {

    /**
     * 获取单条记录
     */
    <T extends Serializable> Mono<T> queryForObject(String id, Class<T> clazz);

    /**
     * 查询列表
     */
    <T extends Serializable> Flux<T> queryForList(LambdaQueryWrapper<T> queryWrapper);

    /**
     * 分页查询
     *
     * @param page 页码
     * @param size 单页数据量
     */
    <T extends Object & Serializable> Mono<PageEntity<T>> queryForPage(LambdaQueryWrapper<T> queryWrapper, int page, int size);

    /**
     * 删除单条记录
     */
    Mono<String> deleteForObject(String id, Class<?> clazz);

    /**
     * 删除若干条数据
     */
    <T extends Serializable> Mono<Long> deleteForList(LambdaDeleteWrapper<T> deleteWrapper);

    /**
     * 更新单条记录
     */
    <T extends Serializable> Mono<Void> updateForObject(LambdaUpdateWrapper<T> updateWrapper);

    /**
     * 更新单条记录
     */
    <T extends Serializable> Mono<Void> updateForObject(T entity);

    /**
     * 批量更新
     */
    <T extends Serializable> Mono<Void> updateForList(List<T> entityList);

    /**
     * 新增单条记录
     */
    <T extends Serializable> Mono<T> save(T entity);

    /**
     * 批量新增
     */
    <T extends Serializable> Flux<T> saveAll(List<T> entityList);

    /**
     * 计数
     */
    <T extends Serializable> Mono<Long> count(LambdaQueryWrapper<T> queryWrapper);

    /**
     * 判断是否存在
     */
    Mono<Boolean> exist(String id, Class<?> clazz);

    /**
     * 分组聚合统计
     */
    <T extends Serializable> Mono<Map<String, List<Map<String, Object>>>> aggregate(LambdaQueryWrapper<T> queryWrapper, Class<T> entityClass);

}
